/**************************************************************************
 * 函数名		：InitSys
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2016-06-19
 * 函数描述 ：端口初始化
 *						端口定义：
 *						端口号									功能									方向							上下拉
 *		
 *						P10/AN0  							转把AD输入  						AD输入  					浮动输入
 *						P11/AN1  							向下键输入							输入  						内部上拉
 *						P12/AN2/INT2/TDO			--------								编程口TDO
 *						P13/AN3/VLPD/TMS			--------								编程口TMS
 *						P14/AN4/TDI						--------								编程口TDI
 *						P15/AN5/TCK						--------								编程口TCK
 *						P16/AN6/T2EX					电门锁电压检测					AD输入  					浮动输入
 *						P17/AN7/T2						电池电压检测						AD输入  					浮动输入
 *
 *						P30/RXD   						Uart——RXD								输入
 *						P31/TXD   						Uart——TXD								输出
 *						P32/INT0 							开关机按键输入					输入  						内部上拉
 *						P34/T0 								HT1621B_DATA端					输出  					
 *						P35/T1/PWM 						背光控制								输出  					
 *						P37 					  			向上键输入							输入  						内部上拉
 *
 *						P40/RESET  						电门锁电源控制					输出
 *						P41/XTAL2							HT1621B_CS端						输出
 *						P42/XTAL1							HT1621B_WR端						输出
 *************************************************************************/
 
#include "..\Inc\includes.h"
 
/**************************************************************************
 * 函数名		：DelayForInit()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：死循环延时，每个延时接近1毫秒
 *************************************************************************/	
/* 
void DelayForInit(unsigned short int u16_delay)
{
	unsigned short int				u16_loop;																											//1100最接近延时1mS
	
	for (; u16_delay>0; u16_delay--)
	{
		for (u16_loop=1100; u16_loop>0;u16_loop--);
	}
}
*/
/**************************************************************************
 * 函数名		：RegisteAndFlagInit()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：寄存器和标志位初始化
 *************************************************************************/	
void RegisteAndFlagInit(void)
{
	unsigned char							temp = 0;
	
	for (; temp<14; temp++)																																	//清显示缓存
	{
		LCD_RAM_Buffer.U8_LCD_DisplayBuffer[temp] = 0x00;
	}
	FunctionSetFlag = FALSE;
	SleepTimeFlag = FALSE;																																	//默认禁止休眠功能
}

/**************************************************************************
 * 函数名		：CurrentAndLowVoltageInit()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：参数和功能初始化设置
 *************************************************************************/	
 void ParameterAndFunctionSetInit(void)
 {
		SSP_ReadUartSendData(ADDR_EXCURSION_PARAMETER);																				//读取功能参数		
		U8_UartSendData[INSIDE_SPEED_MEASURE_BYTE_INDEX] = 0x00;															//内测速磁钢数设定一般不用所有恒为0；
//----------------------------------------------------------------------------------------//	
//欠压值初始化	
		U16_LowVoltageValue = (U8_UartSendData[LOW_VOLTAGE_HIGH_BYTE_INDEX]<<8);
		U16_LowVoltageValue += U8_UartSendData[LOW_VOLTAGE_LOW_BYTE_INDEX];										//得到存储的欠压值
		
		if ((U16_LowVoltageValue!=LOW_VOL_RATED_VOLTAGE_24V)&&(U16_LowVoltageValue						\
		!=LOW_VOL_RATED_VOLTAGE_36V)&&(U16_LowVoltageValue!=LOW_VOL_RATED_VOLTAGE_48V)){			//欠压不是合法的值就设置为默认值
		
			U16_LowVoltageValue = LOW_VOL_RATED_VOLTAGE_36V;																		//欠压值	
		}
		
		if (U16_LowVoltageValue==LOW_VOL_RATED_VOLTAGE_24V)																		//欠压值是24V电池的欠压值
		{
			U8_RatedVoltageValue = BATTERY_VOL_24V;																							//24V电池
			U8_BatteryCellVoltage = VOLTAGE_CELL_VALUE_24V;																			//24V电压下电池图标每格电压值
		}
		else if (U16_LowVoltageValue==LOW_VOL_RATED_VOLTAGE_36V)															//欠压值是36V电池的欠压值
		{
			U8_RatedVoltageValue = BATTERY_VOL_36V;																							//36V电池
			U8_BatteryCellVoltage = VOLTAGE_CELL_VALUE_36V;																			//36V电压下电池图标每格电压值
		}
		else if (U16_LowVoltageValue==LOW_VOL_RATED_VOLTAGE_48V)															//欠压值是48V电池的欠压值
		{
			U8_RatedVoltageValue = BATTERY_VOL_48V;																							//48V电池
			U8_BatteryCellVoltage = VOLTAGE_CELL_VALUE_48V;																			//48V电压下电池图标每格电压值
		}
//----------------------------------------------------------------------------------------//	
//欠压偏移量默认值	
		if ((U8_VoltageOffset>150)||(U8_VoltageOffset<100))																		//电压偏移量范围大约为正负2.5V超过就是错误值，要恢复默认值
		{
			U8_VoltageOffset = VOLTAGE_OFFSET_CENTER_POINT;
			//FunctionSetSaveFlag = TRUE;		
		}
//----------------------------------------------------------------------------------------//	
//限流默认值		
		U8_WorkCurrentValue =	U8_UartSendData[CURRENT_VALUE_BYTE_INDEX];

		if ((U8_WorkCurrentValue<MIN_WORK_CURRENT)||(U8_WorkCurrentValue>MAX_WORK_CURRENT))		//电流值不在范围
		{
			U8_WorkCurrentValue = DEFAULT_WORK_CURRENT;																					//限流设置为默认值	
		}
//----------------------------------------------------------------------------------------//
//背光默认值
		if ((U8_BlacklightClass>BLACKLIGHT_CLASS_THIRD)||(U8_BlacklightClass==0))							//背光如果比最低亮度还小就设置为最小亮度
		{
			U8_Blacklight_PWM_Value = BLACKLIGHT_CLASS_LOW;
			U8_BlacklightClass = BLACKLIGHT_CLASS_FIRST;
		}
		
		if (U8_BlacklightClass==BLACKLIGHT_CLASS_FIRST)																				//初始化对应的背光亮度值
		{
			U8_Blacklight_PWM_Value = BLACKLIGHT_CLASS_LOW;
		}
		else if (U8_BlacklightClass==BLACKLIGHT_CLASS_SECOND)
		{
			U8_Blacklight_PWM_Value = BLACKLIGHT_CLASS_MIDDLE;
		}
		else if (U8_BlacklightClass==BLACKLIGHT_CLASS_THIRD)
		{
			U8_Blacklight_PWM_Value = BLACKLIGHT_CLASS_HIGH;
		}
		PWMD = U8_Blacklight_PWM_Value;																												//开PWM
		
//----------------------------------------------------------------------------------------//
//轮径默认值
		U16_WheelDiameterValue = (U8_UartSendData[WHEEL_DIAMETER_HIGH_BYTE_INDEX]<<8)+U8_UartSendData[WHEEL_DIAMETER_LOW_BYTE_INDEX];
		if ((U16_WheelDiameterValue<MIN_WHEEL_DIAMETER_VALUE)||(U16_WheelDiameterValue>MAX_WHEEL_DIAMETER_VALUE))//如果轮径值不在5~50英寸范围就设置默认值12寸
		{
			U16_WheelDiameterValue = DEFAULT_WHEEL_DIAMETER;
		}
//----------------------------------------------------------------------------------------//
//测速磁钢数默认值	
		U8_SpeedMeasureMagnetNumber = U8_UartSendData[SPEED_MEASURE_MAGNET_BYTE_INDEX];
		if ((U8_SpeedMeasureMagnetNumber<MIN_MAGENT_NUMBER)||(U8_SpeedMeasureMagnetNumber>MAX_MAGENT_NUMBER))	//如果测试磁钢数不在1~250范围就设置为默认值
		{
			U8_SpeedMeasureMagnetNumber = DEFAULT_MAGENT_NUMBER;
		}

//----------------------------------------------------------------------------------------//
//限速值默认值				
		U8_LimitSpeedValue  = U8_UartSendData[LIMIT_SPEED_BYTE_INDEX];												//
		if (U8_LimitSpeedValue>MAX_LIMIT_SPEED)																								//如果限速值超过最大限速值就设置为默认值
		{
			U8_LimitSpeedValue = DEFAULT_LIMIT_SPEED;																						//
		}
		
//----------------------------------------------------------------------------------------//
//控制器设定1字节值
	FirstControllerSetByte = (U8_UartSendData[CONTRLLER_SET_ONE_BYTE_INDEX]&0x04);					//只保留启动方式位，其他为暂不需要
	//ControllerWorkStateFlag = TRUE;																													//控制器默认是工作的
	
//----------------------------------------------------------------------------------------//
//驱动方式默认值	
		U8_DriveTypeValue  = U8_UartSendData[DRIVE_MODE_BYTE_INDEX];													//
		if (U8_DriveTypeValue>0x02)																														//0x02是驱动方式最大的值，超过就设置默认值
		{
			U8_DriveTypeValue = 0x01;																														//设置为电驱动
		}

//----------------------------------------------------------------------------------------//
//助力灵敏度默认值	
		U8_AssistSensitivityValue  = U8_UartSendData[ASSIST_SENSITIVITY_BYTE_INDEX];					//
		if ((U8_AssistSensitivityValue<MIN_ASSIST_SENSITIVITY)||(U8_AssistSensitivityValue>MAX_ASSIST_SENSITIVITY))	//超过范围就设置默认值
		{
			U8_AssistSensitivityValue = DEFAULT_ASSIST_SENSITIVITY;															//设置为默认值
		}
//----------------------------------------------------------------------------------------//
//助力启动强度默认值	
		U8_AssistStartClassValue  = U8_UartSendData[ASSIST_START_CLASS_BYTE_INDEX];						//
		if (U8_AssistStartClassValue>MAX_ASSIST_START_CLASS)																	//超过范围就设置默认值
		{
			U8_AssistStartClassValue = DEFAULT_ASSIST_START_CLASS;															//设置为默认值
		}
//----------------------------------------------------------------------------------------//
//助力磁盘选择
		U8_AssistMagentNumberValue = (U8_UartSendData[CONTRLLER_SET_TWO_BYTE_INDEX]&0x0F);
		if ((U8_AssistMagentNumberValue!=ASSIST_MAGNET_5_UNIT)||(U8_AssistMagentNumberValue		\
				!=ASSIST_MAGNET_5_UNIT)||(U8_AssistMagentNumberValue!=ASSIST_MAGNET_5_UNIT)){			//助力磁盘不是5,8,12磁钢就设置一个默认值
				
			U8_AssistMagentNumberValue = ASSIST_MAGNET_5_UNIT	;	
		}
		
		if (U8_AssistMagentNumberValue==ASSIST_MAGNET_5_UNIT)																	//磁盘类型选择
		{
			U8_AssistMagnetTypeSelect = 0x01;
		}
		else if (U8_AssistMagentNumberValue==ASSIST_MAGNET_8_UNIT)
		{
			U8_AssistMagnetTypeSelect = 0x02;
		}
		else if (U8_AssistMagentNumberValue==ASSIST_MAGNET_12_UNIT)
		{
			U8_AssistMagnetTypeSelect = 0x03;
		}
		
		//SecondControllerSetByte &= 0xF0;
		SecondControllerSetByte = (U8_AssistMagentNumberValue&0x0F);													//低4位是磁盘类型
		FirstControllerStateByte = 0x00;
		SecondControllerStateByte = 0x00;																											//
		U16_DistanceNumber = 0x00;																														//清单次里程数
		OdographNumberRead();																																	//读前次保存的总里程
 }
/**************************************************************************
 * 函数名		：InitSys()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2018-09-30
 * 函数描述 ：系统初始化
 *************************************************************************/ 
void InitSys(void)
{
	CLKCON = 0x0C;																																					//CPU时钟为16.6M  代码选项决定

/*****************************************************************************************	
//端口模式设置说明
	┌─────┬─────┬────────────────────────────────────┐
	│PxM0n│PxM1n│  							 说明 	 						 │
	├─────┼─────┼────────────────────────────────────┤
	│  0  │	 0  │           准双向模式               │
	├─────┼─────┼────────────────────────────────────┤
	│  0  │	 1  │          推挽输出模式              │
	├─────┼─────┼────────────────────────────────────┤
	│  1  │	 0  │        仅输入模式（高阻态）        │
	├─────┼─────┼────────────────────────────────────┤
	│	 1  │	 1  │	         开漏输出模式              │
	└─────┴─────┴────────────────────────────────────┘
*****************************************************************************************/

	P1M0 = (1<<7)+(1<<6)+(1<<5)+(1<<4)+(1<<3)+(1<<2)+(1<<1)+(1<<0);
	P1M1 = (0<<7)+(0<<6)+(0<<5)+(0<<4)+(0<<3)+(0<<2)+(0<<1)+(0<<0);													//P1口全部为输入

	//比较奇怪的现象P3.5如果做输出状态在下电的时候会出现一个毫秒级的高电平脉冲，但做设置成
	//“仅输入模式”就不会出现这个现象，同时PWM可以正常输出
	P3M0 = (1<<7)+(1<<5)+(0<<4)+(0<<3)+(1<<2)+(0<<1)+(1<<0);
	P3M1 = (0<<7)+(0<<5)+(1<<4)+(1<<3)+(0<<2)+(1<<1)+(0<<0);																//P3.7,P3.2,P3.0作为输入其余做推挽输出

	P4M0 = (0<<2)+(0<<1)+(0<<0);
	P4M1 = (1<<2)+(1<<1)+(1<<0);																														//P4口做推挽输出
	
	P1 = 0x00;																																							//端口清零
	P3 = 0x02;
	P4 = 0x00;

/****************************************************************************************/	
//ADC：
//ADC时钟周期tAD = 24 tSYS,一个tAD不能小于1μs，
//一个tAD==(1/16.6)*24=1.45μs
//由于最小采样时间为2tAD,所以采样时间是1.45*2=2.9μs，
//转换一位的时间= 12tAD + 采样时间，所以转换一位的时间=12*1.45+2.9=20.3μs
	ADT = 0xC0;																																							//ADC时钟周期tAD=24tSYS,最小采样时间为2tAD
	ADCH = 0xC1;																																						//通道7,6,0为ADC输入口
	ADCON = ADON;																																						// 允许ADC模块,预先转换转把通道

	
/****************************************************************************************/	
//PWM：
//PWM时钟(PWMCK)==系统频率/8
//周期计算方法：(PWMP*(1/(Fsys/PWMCK)))	;PWMP=PWM周期控制寄存器值，Fsys=16.6MHz，PWMCK=PWM时钟
//占空比计算方法：(PWMD*(1/(Fsys/PWMCK)))	;PWMD=PWM占空比控制寄存器值，Fsys=16.6MHz，PWMCK=PWM时钟
//
//1. PWMEN位能控制PWM模块打开。
//2. PWMSS位能选择P3.5端口是作为I/O端口还是PWM输出端口。
//3. 在IEN1寄存器中的EPWM位能允许/禁止PWM中断。
//4. 如果PWMEN置1，PWM模块打开，但PWMSS = 0，PWM输出关闭，此时PWM模块可以用作一个8bit timer，
//此时如果中断控制寄存器IEN1的EPWM位置1，PWM中断照样发生。

	PWMCON = PWMEN+PWMCK_8_DIVISION;//0xA0;																									//打开PWM模块，PWM模块时钟为系统时钟的8分频，关PWM输出
	PWMP = 0x85;																																						//PWM周期为64us
	PWMD = 0x42;																																						//默认50%PWM，中等亮度 
	
/****************************************************************************************/	
//Uart初始化,波特率为9600
//Uart要使用定时器1作为波特率发生器

  SCON = SM0_AND_SM1+UART_RB_EN;//UART_SM0|UART_SM1|UART_RB_EN;					//0x50;    																//方式1，允许接收
/****************************************************************************************/	
//定时器初始化
	TMOD = 0x22;																																						//定时器0，1以方式2工作，自动重载
	TCON1 = 0x08;    																																				//定时器1使用系统时钟作为时钟源，定时器0选择系统时钟的1/12作为时钟源
	

//----------------------------------------------------------------------------------------//	
//定时器0：
//定时时间100uS；
//定时器0选择系统时钟的1/12作为时钟源
//定时计算方法：256-((Tx/((12*1)/Fsys)))	;Tx=定时时间，Fsys=16.6MHz

	TH0 = 0x76;																																							//256-100/((12*1)/16.6)=118=0x76
	TL0 = 0x76;	
//----------------------------------------------------------------------------------------//	
//定时器1：
//定时器1使用系统时钟作为时钟源
//作为波特率发生器	

	TH1 = TIMER1_INIT_VALUE;																																//波特率对应的预设值，定时方式2下TH1==TL1
	TL1 = TIMER1_INIT_VALUE;																																//
//----------------------------------------------------------------------------------------//	
	RegisteAndFlagInit();																																		//初始化寄存器和标志
	ParameterAndFunctionSetInit();
	
	//DelayForInit(10);
	TMR0_ON();																																							//开定时器0
	TMR1_ON();																																							//开定时器1，产生波特率
	ENABLE_TMR0_INTERRUPT();																																//允许定时器0溢出中断	
	//ENABLE_TMR1_INTERRUPT();																																//允许定时器1溢出中断	
	ENABLE_UART_INTERRUPT();																																//允许Uart中断
	ENABLE_ADC_INTERRUPT();																																	//允许ADC中断
	ENABLE_GLOBAL_INTERRUPT();																															//开总中断
	
}
/**********************SINOWEALTH_SH79F083A**********END OF FILE*************************/
